home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr05 / mswlogo3.zip / MSWLOGO.ZIP / EXAMPLES.ZIP / SOLITAIR < prev    next >
Text File  |  1993-04-13  |  10KB  |  537 lines

  1. ;
  2. ; Function:
  3. ;
  4. ; Solitair game
  5. ;
  6. ; To Run:
  7. ;
  8. ; Load "solitair
  9. ; Call SOLITAIRE
  10. ;
  11. ;;; Every * has an INT to get around a Mac Berkeley Logo bug!
  12.  
  13. TO ASKDIGIT
  14. MAKE "ONTO LIST "PLAYONTO :CHAR
  15. END
  16.  
  17. TO ASKPARSE :CHAR
  18. IF EQUALP :CHAR "U [ASKU STOP]
  19. IF MEMBERP LIST "PLAYONTO :CHAR :ONTO [ASKDIGIT STOP]
  20. BELL
  21. ASKPARSE RC
  22. END
  23.  
  24. TO ASKSTACKS :LIST
  25. IF EMPTYP :LIST [TYPE [FOR STACK] STOP]
  26. IF EQUALP FIRST FIRST :LIST "PLAYTOP [ASKUP STOP]
  27. SPBTYPE 0 LAST FIRST :LIST
  28. TYPE "| |
  29. ASKSTACKS BF :LIST
  30. END
  31.  
  32. TO ASKU
  33. IFELSE EQUALP FIRST LAST :ONTO "PLAYTOP ~
  34.        [MAKE "ONTO LAST :ONTO] [BELL ASKPARSE RC]
  35. END
  36.  
  37. TO ASKUP
  38. TYPE [FOR STACK,]
  39. SETCURSOR [4 21]
  40. TYPE "OR
  41. SPBTYPE 1 "U
  42. TYPE [| FOR| UP.]
  43. END
  44.  
  45. TO ASKWHICH
  46. SETCURSOR [1 20]
  47. TYPE [PLAY WHERE? |TYPE |]
  48. ASKSTACKS :ONTO
  49. ASKPARSE RC
  50. SETCURSOR [1 20]
  51. SPACES 37 PR []
  52. SPACES 37 PR []
  53. END
  54.  
  55. TO BELL
  56. TONE 1500 6
  57. SETEMPTY "DIGIT
  58. END
  59.  
  60. TO BLACKTYPE :WORD
  61. TYPE STANDOUT :WORD
  62. END
  63.  
  64. TO CARDBEFOREP :A :B
  65. IF EQUALP :A "A [OUTPUT EQUALP :B 2]
  66. IF EQUALP :A 10 [OUTPUT EQUALP :B "J]
  67. IF EQUALP :A "J [OUTPUT EQUALP :B "Q]
  68. IF EQUALP :A "Q [OUTPUT EQUALP :B "K]
  69. IF EQUALP :A "K [OUTPUT "FALSE]
  70. IF NOT NUMBERP :B [OUTPUT "FALSE]
  71. OUTPUT EQUALP :A :B-1
  72. END
  73.  
  74. TO CARDDIS :CARD
  75. IFELSE MEMBERP SUIT :CARD :REDS [REDTYPE :CARD] [BLACKTYPE :CARD]
  76. TYPE "| |
  77. END
  78.  
  79. TO CHEAT
  80. SETCURSOR [1 22] SPACES 3
  81. IF NOT EQUALP :DIGIT 8 [BELL STOP]
  82. IF AND EMPTYP :HAND EMPTYP :PILE [BELL STOP]
  83. LPUSH DEAL "PILE
  84. DISPILE
  85. DISHAND
  86. SETEMPTY "DIGIT
  87. END
  88.  
  89. TO CHECKBLACK :NUM
  90. IF NOT MEMBERP SUIT FIRST :STACK :REDS [STOP]
  91. IF CARDBEFOREP (RANK :CARD) (RANK FIRST :STACK) ~
  92.    [PUSH (LIST "PLAYONTO :NUM) "ONTO]
  93. END
  94.  
  95. TO CHECKEMPTY :NUM
  96. IF EQUALP RANK :CARD "K [PUSH (LIST "PLAYONTO :NUM) "ONTO OUTPUT "TRUE]
  97. OUTPUT "FALSE
  98. END
  99.  
  100. TO CHECKFULL :NUM :STACK
  101. IFELSE MEMBERP SUIT :CARD :REDS [CHECKRED :NUM] [CHECKBLACK :NUM]
  102. END
  103.  
  104. TO CHECKONTO :NUM
  105. IF :NUM = 0 [STOP]
  106. IFELSE STACKEMPTYP SHOWN :NUM ~
  107.        [IF CHECKEMPTY :NUM [STOP]] [CHECKFULL :NUM THING SHOWN :NUM]
  108. CHECKONTO :NUM-1
  109. END
  110.  
  111. TO CHECKRED :NUM
  112. IF MEMBERP SUIT FIRST :STACK :REDS [STOP]
  113. IF CARDBEFOREP (RANK :CARD) (RANK FIRST :STACK) ~
  114.    [PUSH (LIST "PLAYONTO :NUM) "ONTO]
  115. END
  116.  
  117. TO CHECKTOP
  118. IF EQUALP RANK :CARD "A ~
  119.    [IF EMPTYP TOP SUIT :CARD ~
  120.        [PUSH (LIST "PLAYTOP WORD "" SUIT :CARD) "ONTO] ~
  121.     STOP]
  122. IF CARDBEFOREP (TOP SUIT :CARD) (RANK :CARD) ~
  123.    [PUSH (LIST "PLAYTOP WORD "" SUIT :CARD) "ONTO]
  124. END
  125.  
  126. TO COVEREDP
  127. IF EQUALP :WHERE [REMPILE] [OUTPUT "FALSE]
  128. OUTPUT NOT EQUALP :CARD FIRST THING SHOWN LAST :WHERE
  129. END
  130.  
  131. TO DEAL
  132. IF EMPTYP :HAND [MAKE "HAND :PILE SETEMPTY "PILE]
  133. IF EMPTYP :HAND [OUTPUT []]
  134. OUTPUT SPOP "HAND
  135. END
  136.  
  137. TO DECK
  138. OP MAKESUITS (SE :HEART :SPADE :DIAMOND :CLUB)
  139. END
  140.  
  141. TO DISHAND
  142. SETCURSOR [27 23]
  143. TYPE COUNT :HAND
  144. TYPE "| |
  145. END
  146.  
  147. TO DISPILE
  148. SETCURSOR [32 23]
  149. IFELSE EMPTYP :PILE [SPACES 3] [CARDDIS LAST :PILE]
  150. END
  151.  
  152. TO DISSTACK :NUM
  153. SETCURSOR LIST INT (-3+5*:NUM) 4
  154. TYPE IFELSE STACKEMPTYP HIDDEN :NUM ["| |] ["-]
  155. IF STACKEMPTYP SHOWN :NUM ~
  156.    [SETCURSOR LIST INT (-4+5*:NUM) 5 SPACES 3 STOP]
  157. DISSTACK1 :NUM (THING SHOWN :NUM)
  158. END
  159.  
  160. TO DISSTACK1 :NUM :STACK
  161. DISSTACK2 (4+COUNT :STACK) INT (-4+5*:NUM) :STACK
  162. END
  163.  
  164. TO DISSTACK2 :ROW :COL :STACK
  165. IF EMPTYP :STACK [STOP]
  166. SETCURSOR LIST :COL :ROW
  167. CARDDIS FIRST :STACK
  168. DISSTACK2 :ROW-1 :COL BF :STACK
  169. END
  170.  
  171. TO DISSTACKS :NUM
  172. IF :NUM = 0 [STOP]
  173. DISSTACK :NUM
  174. DISSTACKS :NUM-1
  175. END
  176.  
  177. TO DISTOP :SUIT
  178. IF EMPTYP TOP :SUIT [STOP]
  179. IF EQUALP :SUIT :HEART [DISTOP1 4 STOP]
  180. IF EQUALP :SUIT :SPADE [DISTOP1 11 STOP]
  181. IF EQUALP :SUIT :DIAMOND [DISTOP1 18 STOP]
  182. DISTOP1 25
  183. END
  184.  
  185. TO DISTOP1 :COL
  186. SETCURSOR LIST :COL 2
  187. CARDDIS WORD (TOP :SUIT) :SUIT
  188. END
  189.  
  190. TO FINDCARD
  191. IF FINDPILE [STOP]
  192. MAKE "WHERE FINDSHOWN 7
  193. IF EMPTYP :WHERE [BELL]
  194. END
  195.  
  196. TO FINDPILE
  197. IF EMPTYP :PILE [OUTPUT "FALSE]
  198. IF EQUALP :CARD LAST :PILE [MAKE "WHERE [REMPILE] OUTPUT "TRUE]
  199. OUTPUT "FALSE
  200. END
  201.  
  202. TO FINDSHOWN :NUM
  203. IF :NUM = 0 [OUTPUT []]
  204. IF MEMBERP :CARD THING SHOWN :NUM [OP SE "REMSHOWN :NUM]
  205. OP FINDSHOWN :NUM-1
  206. END
  207.  
  208. TO HAND3
  209. IF NOT EMPTYP :DIGIT [BELL STOP]
  210. IF AND EMPTYP :HAND EMPTYP :PILE [BELL STOP]
  211. LPUSH DEAL "PILE
  212. REPEAT 2 [IF NOT EMPTYP :HAND [LPUSH DEAL "PILE]]
  213. DISPILE
  214. DISHAND
  215. END
  216.  
  217. TO SHELP
  218. CT
  219. INSTRUCT
  220. SPBPR 0 [TYPE ANY KEY TO CONTINUE]
  221. IGNORE RC
  222. REDISPLAY
  223. END
  224.  
  225. TO HIDDEN :NUM
  226. OUTPUT WORD "HIDDEN :NUM
  227. END
  228.  
  229. TO INITHIDDEN :NUM
  230. SETEMPTY HIDDEN :NUM
  231. REPEAT :NUM [PUSH DEAL HIDDEN :NUM]
  232. END
  233.  
  234. TO INITSTACKS :NUM
  235. IF :NUM = 0 [STOP]
  236. INITHIDDEN :NUM
  237. TURNUP :NUM
  238. INITSTACKS :NUM-1
  239. END
  240.  
  241. TO INSTRUCT
  242. PR [WELCOME TO SOLITAIRE]
  243. PR []
  244. PR [HERE ARE THE COMMANDS YOU CAN TYPE:]
  245. SPBTYPE 4 "+ SPPR 4 [DEAL THREE CARDS ONTO PILE]
  246. SPBTYPE 4 "P SPPR 4 [PLAY TOP CARD FROM PILE]
  247. SPBTYPE 4 "R SPPR 4 [REDISPLAY THE BOARD]
  248. SPBTYPE 4 "? SPPR 4 [RETYPE THESE INSTRUCTIONS]
  249. SPBTYPE 4 "CARD SPPR 1 [PLAY THAT CARD]
  250. PR []
  251. PR [A CARD CONSISTS OF A RANK:]
  252. SPBPR 3 [A 2 3 4 5 6 7 8 9 10 J Q K]
  253. PR [FOLLOWED BY A SUIT:]
  254. SPBPR 3 [H S D C]
  255. PR []
  256. PR [IF YOU MAKE A MISTAKE,]
  257. SPPR 3 [HIT THE SPACE BAR.]
  258. PR []
  259. PR [TO MOVE AN ENTIRE STACK,]
  260. SPPR 3 [HIT THE SHIFTED STACK NUMBER:]
  261. SPBTYPE 5 [! @ # $ % ^ &] SPPR 1 [FOR STACKS]
  262. SPPR 5 [1 2 3 4 5 6 7]
  263. PR []
  264. END
  265.  
  266. TO INVTYPE :TEXT
  267. TYPE STANDOUT :TEXT
  268. END
  269.  
  270. TO LOOP
  271. IF EMPTYP :DIGIT [SETCURSOR [1 22] SPACES 6 SETCURSOR [1 22]]
  272. PARSEKEY RC
  273. LOOP
  274. END
  275.  
  276. TO LPOP :STACK
  277. LOCAL "RESULT
  278. MAKE "RESULT LAST THING :STACK
  279. MAKE :STACK BL THING :STACK
  280. OUTPUT :RESULT
  281. END
  282.  
  283. TO LPUSH :THING :STACK
  284. MAKE :STACK LPUT :THING THING :STACK
  285. END
  286.  
  287. TO MAKESUIT :SUIT :CARDS
  288. IF EMPTYP :CARDS [OUTPUT []]
  289. OUTPUT FPUT (WORD FIRST :CARDS :SUIT) MAKESUIT :SUIT BF :CARDS
  290. END
  291.  
  292. TO MAKESUITS :LIST
  293. IF EMPTYP :LIST [OUTPUT []]
  294. OUTPUT SE MAKESUIT FIRST :LIST [A 2 3 4 5 6 7 8 9 10 J Q K] ~
  295.           MAKESUITS BF :LIST
  296. END
  297.  
  298. TO PARSEDIGIT :CHAR
  299. IF NOT EMPTYP :DIGIT [BELL STOP]
  300. MAKE "DIGIT :CHAR
  301. TYPE :CHAR
  302. END
  303.  
  304. TO PARSEKEY :CHAR
  305. IF MEMBERP :CHAR [1 2 3 4 5 6 7 8 9 A J Q K] [PARSEDIGIT :CHAR STOP]
  306. IF EQUALP :CHAR "0 [PARSEZERO STOP]
  307. IF MEMBERP :CHAR [H S D C] [PARSESUIT :CHAR STOP]
  308. IF MEMBERP :CHAR [+ =] [HAND3 STOP]
  309. IF EQUALP :CHAR "R [REDISPLAY STOP]
  310. IF EQUALP :CHAR "? [SHELP STOP]
  311. IF EQUALP :CHAR "P [PLAYPILE STOP]
  312. IF MEMBERP :CHAR [! @ # $ % ^ &] [PLAYSTACK :CHAR [! @ # $ % ^ &] STOP]
  313. IF EQUALP :CHAR "| | [RUBOUT STOP]
  314. IF EQUALP :CHAR "\( [CHEAT STOP]
  315. BELL
  316. END
  317.  
  318. TO PARSESUIT :CHAR
  319. IF EMPTYP :DIGIT [BELL STOP]
  320. IF EQUALP :DIGIT 1 [MAKE "DIGIT "A]
  321. IF EQUALP :CHAR "H [MAKE "CHAR :HEART]
  322. IF EQUALP :CHAR "S [MAKE "CHAR :SPADE]
  323. IF EQUALP :CHAR "D [MAKE "CHAR :DIAMOND]
  324. IF EQUALP :CHAR "C [MAKE "CHAR :CLUB]
  325. TYPE :CHAR
  326. MAKE "CARD WORD :DIGIT :CHAR
  327. SETEMPTY "DIGIT
  328. FINDCARD
  329. IF NOT EMPTYP :WHERE [PLAYCARD]
  330. END
  331.  
  332. TO PARSEZERO
  333. IF NOT EQUALP :DIGIT 1 [BELL STOP]
  334. MAKE "DIGIT 10
  335. TYPE 0
  336. END
  337.  
  338. TO PLAYCARD
  339. SETEMPTY "ONTO
  340. IF NOT COVEREDP [CHECKTOP]
  341. CHECKONTO 7
  342. IF EMPTYP :ONTO [BELL STOP]
  343. IFELSE (COUNT :ONTO) > 1 [ASKWHICH] [MAKE "ONTO FIRST :ONTO]
  344. RUN :WHERE
  345. RUN :ONTO
  346. SETEMPTY "DIGIT
  347. END
  348.  
  349. TO PLAYONTO :NUM
  350. IF EMPTYP :CARDS [DISSTACK :NUM STOP]
  351. PUSH (SPOP "CARDS) SHOWN :NUM
  352. PLAYONTO :NUM
  353. END
  354.  
  355. TO PLAYPILE
  356. IF EMPTYP :PILE [BELL STOP]
  357. IF NOT EMPTYP :DIGIT [BELL STOP]
  358. MAKE "CARD LAST :PILE
  359. MAKE "WHERE [REMPILE]
  360. CARDDIS :CARD
  361. PLAYCARD
  362. END
  363.  
  364. TO PLAYSTACK :WHICH :LIST
  365. IF NOT EMPTYP :DIGIT [BELL STOP]
  366. PLAYSTACK1 :WHICH :LIST 1
  367. END
  368.  
  369. TO PLAYSTACK1 :WHICH :LIST :NUM
  370. IF EQUALP :WHICH FIRST :LIST [PLAYSTACK2 :NUM STOP]
  371. PLAYSTACK1 :WHICH BF :LIST :NUM+1
  372. END
  373.  
  374. TO PLAYSTACK2 :NUM
  375. IF STACKEMPTYP SHOWN :NUM [BELL STOP]
  376. MAKE "CARD LAST THING SHOWN :NUM
  377. MAKE "WHERE SE "REMSHOWN :NUM
  378. CARDDIS :CARD
  379. PLAYCARD
  380. END
  381.  
  382. TO PLAYTOP :SUIT
  383. SETTOP :SUIT RANK :CARD
  384. DISTOP :SUIT
  385. END
  386.  
  387. TO PUSH :THING :STACK
  388. MAKE :STACK FPUT :THING THING :STACK
  389. END
  390.  
  391. TO RANK :CARD
  392. OUTPUT BL :CARD
  393. END
  394.  
  395. TO REDISPLAY
  396. CT
  397. DISSTACKS 7
  398. DISTOP :HEART
  399. DISTOP :SPADE
  400. DISTOP :DIAMOND
  401. DISTOP :CLUB
  402. DISPILE
  403. DISHAND
  404. SETCURSOR [1 22]
  405. SETEMPTY "DIGIT
  406. END
  407.  
  408. TO REDTYPE :WORD
  409. TYPE :WORD
  410. END
  411.  
  412. TO REMOVE :NUM :LIST
  413. IF :NUM = 1 [OUTPUT BF :LIST]
  414. OP FPUT FIRST :LIST REMOVE :NUM-1 BF :LIST
  415. END
  416.  
  417. TO REMPILE
  418. MAKE "CARDS (LIST (LPOP "PILE))
  419. DISPILE
  420. END
  421.  
  422. TO REMSHOWN :NUM
  423. SETEMPTY "CARDS
  424. REMSHOWN1 :NUM 1 (COUNT THING SHOWN :NUM)
  425. IF STACKEMPTYP SHOWN :NUM [TURNUP :NUM DISSTACK :NUM]
  426. END
  427.  
  428. TO REMSHOWN1 :NUM :DEPTH :LENGTH
  429. PUSH (SPOP SHOWN :NUM) "CARDS
  430. IF EQUALP :CARD FIRST :CARDS ~
  431.    [REMSHOWN2 :DEPTH (5+:LENGTH-:DEPTH) INT (-4+5*:NUM) STOP]
  432. REMSHOWN1 :NUM :DEPTH+1 :LENGTH
  433. END
  434.  
  435. TO REMSHOWN2 :DEPTH :ROW :COL
  436. IF :DEPTH = 0 [STOP]
  437. SETCURSOR LIST :COL :ROW
  438. SPACES 3
  439. REMSHOWN2 :DEPTH-1 :ROW+1 :COL
  440. END
  441.  
  442. TO RUBOUT
  443. SETCURSOR [1 22]
  444. SPACES 4
  445. SETCURSOR [1 22]
  446. SETEMPTY "DIGIT
  447. END
  448.  
  449. TO SETEMPTY :STACK
  450. MAKE :STACK []
  451. END
  452.  
  453. TO SETTOP :SUIT :VALUE
  454. MAKE (WORD "TOP :SUIT) :VALUE
  455. END
  456.  
  457. TO SHOWN :NUM
  458. OUTPUT WORD "SHOWN :NUM
  459. END
  460.  
  461. TO SHUFFLE :LEN :LIST
  462. LOCAL "NEW
  463. SETEMPTY "NEW
  464. REPEAT :LEN [SHUFFLE1 1+RANDOM :LEN]
  465. OP :NEW
  466. END
  467.  
  468. TO SHUFFLE1 :RAND
  469. PUSH (ITEM :RAND :LIST) "NEW
  470. MAKE "LIST REMOVE :RAND :LIST
  471. MAKE "LEN :LEN-1
  472. END
  473.  
  474. TO SOLITAIRE
  475. INSTRUCT
  476. PR [SHUFFLING, PLEASE WAIT...]
  477. MAKE "HEART "H
  478. MAKE "SPADE "S
  479. MAKE "DIAMOND "D
  480. MAKE "CLUB "C
  481. MAKE "HAND SHUFFLE 52 DECK
  482. SETEMPTY "PILE
  483. INITSTACKS 7
  484. MAKE "REDS LIST :HEART :DIAMOND
  485. SETTOP :HEART "
  486. SETTOP :SPADE "
  487. SETTOP :DIAMOND "
  488. SETTOP :CLUB "
  489. REDISPLAY
  490. LOOP
  491. END
  492.  
  493. TO SPACES :NUM
  494. REPEAT :NUM [TYPE "| |]
  495. END
  496.  
  497. TO SPBPR :SPACES :TEXT
  498. SPBTYPE :SPACES :TEXT
  499. PR []
  500. END
  501.  
  502. TO SPBTYPE :SPACES :TEXT
  503. SPACES :SPACES
  504. INVTYPE :TEXT
  505. END
  506.  
  507. TO SPOP :STACK
  508. LOCAL "RESULT
  509. MAKE "RESULT FIRST THING :STACK
  510. MAKE :STACK BF THING :STACK
  511. OUTPUT :RESULT
  512. END
  513.  
  514. TO SPPR :SPACES :TEXT
  515. SPACES :SPACES
  516. PR :TEXT
  517. END
  518.  
  519. TO STACKEMPTYP :NAME
  520. OUTPUT EMPTYP THING :NAME
  521. END
  522.  
  523. TO SUIT :CARD
  524. OUTPUT LAST :CARD
  525. END
  526.  
  527. TO TOP :SUIT
  528. OUTPUT THING WORD "TOP :SUIT
  529. END
  530.  
  531. TO TURNUP :NUM
  532. SETEMPTY SHOWN :NUM
  533. IF STACKEMPTYP HIDDEN :NUM [STOP]
  534. PUSH (SPOP HIDDEN :NUM) SHOWN :NUM
  535. END
  536.  
  537.